import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

// widget的主要工作是提供一个build()方法来描述如何构建UI界面（通常是通过组合、拼装其它基础widget）

// 一个widget
class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
        visualDensity: VisualDensity.adaptivePlatformDensity,
      ),
      // home: MyHomePage(title: 'Flutter Demo Home Page'),

      //////////// 注册路由表
      // routes: {
      //   // "new_page": (context) => NewRoute(),
      //   "new_page": (context) => EchoRoute(),
      //   "/": (context) => MyHomePage(title: 'Flutter Demo Home Page'),
      // },
      //////////// 注册路由表

      ///////////////////////// onGenerateRoute
      // onGenerateRoute只会对命名路由生效
      onGenerateRoute: (RouteSettings settings) {
        return MaterialPageRoute(builder: (context) {
          /**
           * 如果访问的路由页需要登录，但当前未登录，则直接返回登录页路由， 引导用户登录；其它情况则正常打开路由。
           */
          String routeName = settings.name;
          print("Open page: $routeName");

          switch (routeName) {
            case "/":
              return MyHomePage(title: 'Flutter Demo Home Page');
            case "new_page":
              return EchoRoute();
          }
        }
        ,settings: settings
        );
      },
      ///////////////////////// onGenerateRoute
    );
  }
}

// 一个有状态的组件widget
// MyHomePage类中并没有build方法，取而代之的是，build方法被挪到了_MyHomePageState方法中
class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  // setState方法的作用是通知Flutter框架，有状态发生了改变，Flutter框架收到通知后，会执行build方法来根据新的状态重新构建界面
  void _incrementCounter() {
    setState(() {
      _counter++;
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text(
              'You have clicked the button this many times:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headline4,
            ),
            FlatButton(
              onPressed: () {
                // 导航到新路由
                /**
                 * MaterialPageRoute 继承自PageRoute类,
                 * PageRoute类是一个抽象类，表示占有整个屏幕空间的一个模态路由页面，它还定义了路由构建及切换时过渡动画的相关接口及属性
                 */
                // Navigator.push(context, MaterialPageRoute(builder: (context) {
                //   return NewRoute();
                // }));

                // 通过路由名打开新路由页
                // Navigator.pushNamed(context, "new_page");

                Navigator.pushNamed(context, "new_page", arguments: "hello");
              },
              child: Text("open new route"),
              textColor: Colors.blue,
            ),
            FlatButton(
              onPressed: () {
                // 路由传值
                Navigator.push(context, MaterialPageRoute(builder: (context) {
                  return RouterTestRoute();
                }));
              },
              child: Text("路由传值"),
              textColor: Colors.blue,
            )
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: 'Increment',
        child: Icon(Icons.add),
      ),
    );
  }
}

// 新路由
class NewRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: AppBar(
        title: Text("New route"),
      ),
      body: Center(
        child: Text("This is new route"),
      ),
    );
  }
}

////////////////////////// 路由传值
class RouterTestRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Center(
        child: RaisedButton(
      onPressed: () async {
        var result =
            await Navigator.push(context, MaterialPageRoute(builder: (context) {
          return new TipRoute(
            text: "我是提示xxxx",
          );
        }));

        //输出`TipRoute`路由返回结果
        print("路由返回值: $result");
      },
      child: Text("打开提示页"),
    ));
  }
}

// 在路由跳转时我们需要带一些参数，比如打开商品详情页时，我们需要带一个商品id，这样商品详情页才知道展示哪个商品信息
// 第一种方式时直接点击导航栏返回箭头，第二种方式是点击页面中的“返回”按钮。这两种返回方式的区别是前者不会返回数据给上一个路由，而后者会。
class TipRoute extends StatelessWidget {
  final String text;

  // this.text 接收一个text参数
  TipRoute({Key key, @required this.text}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("提示"),
      ),
      body: Padding(
        padding: EdgeInsets.all(18),
        child: Column(
          children: <Widget>[
            Text(this.text),
            RaisedButton(
              onPressed: () => Navigator.pop(context, "我是返回值"),
              child: Text("返回"),
            )
          ],
        ),
      ),
    );
  }
}
////////////////////////// 路由传值

//////////////////// 注册路由，并传参
class EchoRoute extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    var args = ModalRoute.of(context).settings.arguments;
    print(args);
    return Text(args);
  }
}

//////////////////// 注册路由
